package de.fhffm.gaertnerei.gui;
/**
 * @author Riad Hassani & Julian Schmücker
 */

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;

import de.fhffm.gaertnerei.exceptions.EingabeException;
import de.fhffm.gaertnerei.tabellen.Aussaat;
import de.fhffm.gaertnerei.tabellen.Duenger;
import de.fhffm.gaertnerei.tabellen.PflanzOrt;
import de.fhffm.gaertnerei.tabellen.Pflanze;

@SuppressWarnings("serial")
public class NeueAussaatFenster extends JFrame implements ActionListener {

	private JButton buttonOk = new JButton("OK");
	private JButton buttonAbbrechen = new JButton("Abbrechen");
	private JButton buttonPflanze = new JButton("+");
	private JButton buttonDuenger = new JButton("+");
	
	private JLabel labelUeberschrift = new JLabel("Neue Aussaat");
	private JLabel labelPflanze = new JLabel("Pflanze");
	private JLabel labelDuenger = new JLabel("Duenger");
	private JLabel labelOrt = new JLabel("Pflanz Ort");
	private JLabel labelDuengerMenge = new JLabel("DuengerMenge");
	private JLabel labelDatum= new JLabel("Datum");
	private JLabel labelKilogramm = new JLabel ("Kilogramm");
	
	private JTextField textfeldPflanze = new JTextField(8);
	private JTextField textfeldDuenger = new JTextField(8);
	private JTextField textfeldDuengerMenge = new JTextField(8);
	
	private JFormattedTextField textfeldDatum ;
	
	private MaskFormatter datumFormat= null;
	
	private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
	
	private Date aktuellesDatum = new Date();
	
	private JPanel panelEingabe = new JPanel(new GridLayout(5,2));
	private JPanel panelButton = new JPanel();
	private JPanel panelUeberschrift = new JPanel();
	
	private String pflanzeString = null;
	private String duengerString = null;
	private String ortString = null;
	private String datumString;
	private String duengerMengeString = null;
	private String[] orte = {"Topf klein","Topf mittel","Topf groß","Feld","Beet"};
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private JComboBox ortListe = new JComboBox(orte);

	private double duengerMengeDoube = 0;
	
	StringBuilder stringBuilder = new StringBuilder();
	
	public NeueAussaatFenster() {
		
		setzeTextfeldEigenschaften();
		setzeDatumtextfeldFeld();
		bestandteileAnordnen();
		ereignissensorenAnmeldung();
		erstelleFenster();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object obj = e.getSource();
		
		if(obj == buttonPflanze){
			new PflanzenTabelle(textfeldPflanze);
		}
		
		if(obj == buttonDuenger){
			new DuengerTabelle(textfeldDuenger);
		}
		
		if(obj == buttonOk){
			
			if(ueberpruefeEingabe()){
				
				pruefePflanzOrt();
				fuegeAussaatEin();
				einfügenEnde();
				
			}else{
				System.out.println("Eingabe Fehler");
			}
		}
		
		if(obj == buttonAbbrechen){
			dispose();
		}
	}
	
	private void setzeTextfeldEigenschaften() {
		
		textfeldPflanze.setEnabled(false); // Textfeld kann nicht beschrieben werden
		textfeldDuenger.setEnabled(false);
		textfeldDuengerMenge.setToolTipText("Menge des eingesetzten Düngers in Kilogramm");		
	}

	private void erstelleFenster() {
		
		setTitle("Neue Aussaat");	
		setSize(400,500);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);	
		pack();
		setVisible(true);
		setResizable(false);
	}

	public void ereignissensorenAnmeldung(){
		
		buttonOk.addActionListener(this);
		buttonAbbrechen.addActionListener(this);
		buttonPflanze.addActionListener(this);
		buttonDuenger.addActionListener(this);
	}
	
	public void bestandteileAnordnen(){
		
		GroupLayout neuePflanzeFensterLayout = new GroupLayout(getContentPane());
		getContentPane().setLayout(neuePflanzeFensterLayout);
		
		neuePflanzeFensterLayout.setAutoCreateGaps(true);
		neuePflanzeFensterLayout.setAutoCreateContainerGaps(true);
		
		neuePflanzeFensterLayout.setVerticalGroup(neuePflanzeFensterLayout.createSequentialGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButton)
		);
		
		neuePflanzeFensterLayout.setHorizontalGroup(neuePflanzeFensterLayout.createParallelGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButton)
		);		
	
		panelUeberschriftAnordnen();
		panelEingabeAnordnen();
		panelButtonAnordnen();
	}

	private void panelUeberschriftAnordnen(){
		panelUeberschrift.setLayout(new FlowLayout());
		panelUeberschrift.add(labelUeberschrift);
		labelUeberschrift.setFont(new Font("Times new Roman", Font.BOLD, 22));
	}
		
	public void panelEingabeAnordnen(){
		
		GroupLayout eingabePanelLayout = new GroupLayout(panelEingabe);
		panelEingabe.setLayout(eingabePanelLayout);
		
		eingabePanelLayout.setAutoCreateGaps(true);
		eingabePanelLayout.setAutoCreateContainerGaps(true);
		
		eingabePanelLayout.setVerticalGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						addComponent( labelPflanze ).
						addComponent( textfeldPflanze ).
						addComponent( buttonPflanze )
					).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
					  	addComponent( labelDuenger ).
						addComponent( textfeldDuenger ).
						addComponent( buttonDuenger )
					).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						  	addComponent( labelOrt ).
							addComponent( ortListe )
					).
			  		addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
			  			addComponent( labelDuengerMenge ).
			  			addComponent( textfeldDuengerMenge ).
			  			addComponent( labelKilogramm )
					).
			  		addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						addComponent( labelDatum ).
					  	addComponent( textfeldDatum )));
						
		eingabePanelLayout.setHorizontalGroup(eingabePanelLayout.createParallelGroup( ).addGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( labelPflanze, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelDuenger,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelOrt,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelDuengerMenge, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelDatum,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE )
					).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( textfeldPflanze, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldDuenger,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( ortListe,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldDuengerMenge, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldDatum,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE )
					).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( buttonPflanze, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( buttonDuenger,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelKilogramm, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ))));
	}

	public void panelButtonAnordnen(){
		
		panelButton.setLayout(new FlowLayout());
		panelButton.add(buttonOk);
		panelButton.add(buttonAbbrechen);
	}

	private void setzeDatumtextfeldFeld() {
		
		try {
			datumFormat = new MaskFormatter("##.##.####");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		textfeldDatum = new JFormattedTextField(datumFormat);
		textfeldDatum.setText(simpleDateFormat.format(aktuellesDatum));
		panelEingabe.add(textfeldDatum);
	}

	private void pruefePflanzOrt() {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("chilidatenbank");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		
	    Query q = em.createQuery("SELECT f FROM PflanzOrt f WHERE  f.ort = :name");
	        	q.setParameter("name",ortString);

	   if(q.getResultList().isEmpty()){
		   System.out.println("Pflanz Ort noch nicht vorhanden!");
		   em.close();
		   fuegePflanzOrtein();
	   }else{
		   System.out.println("Pflanz Ort schon vorhanden");
		   em.close();
	   }
	}

	private void fuegePflanzOrtein() {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("chilidatenbank");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		PflanzOrt pflanzOrt = new PflanzOrt();
		
		pflanzOrt.setOrt(ortString);
		
		em.persist(pflanzOrt);
		em.getTransaction().commit();
		em.close();
		
	}

	private boolean ueberpruefeEingabe() {
		
		boolean pruefe = false;
		try {
			ueberpruefeDatum();
			pruefe = hohleEingabe();
		} catch (EingabeException e) {
			System.out.println("Eingabe Fehlt");
		} catch (NumberFormatException n){
			System.out.println("Bitte Zahlen eingeben!");
			JOptionPane.showMessageDialog(null,"Bitte für die Dünger Menge eine Zahl eingeben.","Fehler",JOptionPane.ERROR_MESSAGE);
		}
		return pruefe;
	}
	
	private boolean hohleEingabe() throws EingabeException,NumberFormatException {
		
		pflanzeString = textfeldPflanze.getText();
		duengerString = textfeldDuenger.getText();
		ortString = (String) ortListe.getSelectedItem();
		duengerMengeDoube = Double.parseDouble(textfeldDuengerMenge.getText());
		stringBuilder.append(duengerMengeDoube).append(" Kilogramm"); // Kilogramm an Dünger menge hängen
		duengerMengeString = stringBuilder.toString();
		stringBuilder.setLength(0);
		datumString = textfeldDatum.getText();

		if(isEingabeLeer()){
			
			throw new EingabeException("Eine oder mehrere Eingaben fehlen, bitte keine negativen Zahlen/Nullwerte eingeben!");
		
		}else{

			return true;

		}
	}
	
	private void ueberpruefeDatum() throws EingabeException {
        
		/*Das Aktuelle Datum wird in einen String mit dem format dd.mm.yyyy umgewandelt.
		Dann wird das aktuelle Datum wieder als Date gespeichert nur mit dem vorher definierten format
		so kann das aktuelle Datum mit dem eingegebenen Datum verglichen werden */
		
		datumString = textfeldDatum.getText();
		Date eingegebenesDatum = null;				
		String aktuellesDatumString = simpleDateFormat.format(aktuellesDatum);
		String[] teilString = datumString.split(Pattern.quote(".")); // Das eingegebene Datum wird gesplittet
		int jahr = Integer.parseInt(teilString[2]);
		 
		try {
			
			 eingegebenesDatum = simpleDateFormat.parse(datumString);
			 aktuellesDatum = simpleDateFormat.parse(aktuellesDatumString);
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		if(eingegebenesDatum.after(aktuellesDatum)){
			
			throw new EingabeException("Das eingegebene Datum darf nicht nach dem aktuellem Datum liegen!");
			
		/*
		 *  Eingegebenes Datum ist ungültig wenn kein Tag, Monat oder Jahr angegeben wird bsp.: 00.00.0000	
		 *  um dies zu überprüfen wird der vorher gesplittete String genutzt.
		 *  Oder auch wenn das eingegebene Jahr vor 1970 ist dan ist es auch ungültig!
		 */
		 
		}else if((teilString[0]).equals("00") || (teilString[1].equals("00") || teilString[2].equals("0000") 
				  || teilString[2].substring(0, 1).equals("0"))){
			
		    throw new EingabeException("Das Datum muss im format tt.mm.yyyy eingegeben werden und darf nicht 0 sein");
		    
		}else if(jahr < 1970){
			
			throw new EingabeException("Das eingegebene Datum  darf nicht vor dem Jahr 1970 liegen");
			
		}else if(eingegebenesDatum.equals(aktuellesDatum)){
			
			System.out.println("Alles ok");
		}
	}

	private boolean isEingabeLeer() {
		
		if(pflanzeString.length() == 0 || duengerString.length() == 0 || ortString.length() == 0 
		   || duengerMengeDoube <= 0.0 ) {	
			
			return true;
			
		}else{
			return false;
		}
	}

	private void fuegeAussaatEin() {
		/*
		 *  Die verschiedenen Attribute werden gehohlt, der Aussaat zugewiesen
		 *  und die Aussaat wird dan eingefügt
		 */
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("chilidatenbank");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT p FROM Pflanze p WHERE p.sorte = :name");
				  q.setParameter("name", pflanzeString);
				  
		Pflanze pflanze = (Pflanze) q.getSingleResult(); // Pflanze wird gehohlt
		
		q =  em.createQuery("SELECT d FROM Duenger d WHERE d.duengerMarke = :name");
		  	 q.setParameter("name", duengerString);
		
		Duenger duenger = (Duenger) q.getSingleResult(); // Duenger wird gehohlt
		
		q = em.createQuery("SELECT p FROM PflanzOrt p WHERE p.ort =:name");
			q.setParameter("name", ortString);
		
		PflanzOrt pflanzort = (PflanzOrt) q.getSingleResult(); // PflanzOrt wird gehohlt
		
		
		Aussaat aussaat = new Aussaat();

		aussaat.setPflanze(pflanze);
		aussaat.setDuenger(duenger);
		aussaat.setPflanzOrt(pflanzort);
		pflanze.getAussaat().add(aussaat);
		duenger.getAussaat().add(aussaat);
		pflanzort.getAussaat().add(aussaat);
		
		aussaat.setDuengerMenge(duengerMengeString);
		aussaat.setAussaatDatum(datumString);
		
		em.persist(pflanze);
		em.persist(aussaat);
		em.persist(duenger);
		em.persist(pflanzort);
		em.getTransaction().commit();
		em.close();
	}
	
	private void einfügenEnde() {
		
		Object[] options = {"Fertig!","Neue Aussaat!"};
		int selected = JOptionPane.showOptionDialog(null,"Aussaat hinzugefügt!", "Hinzufügen Erfolgreich", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options ,options[1]);
		
		switch(selected){
		case 0://Fertig
			dispose();
			break;
		case 1://Neue Aussaat
			loescheTextFelder();
			break;
		}
	}
	
	private void loescheTextFelder() {
		
		textfeldDatum.setText(null);
		textfeldDuenger.setText(null);
		textfeldDuengerMenge.setText(null);
		textfeldPflanze.setText(null);
		ortListe.setSelectedIndex(0);
		
	}
	
}